//package com.pony.iphone.controller;
//
//import com.alibaba.fastjson.JSON;
//import com.pony.iphone.data.FileDB;
//import com.pony.iphone.dto.QuestionAnswerDto;
//import com.pony.iphone.dto.QuestionAnswerErrorDto;
//import com.pony.iphone.service.QuestionService;
//import com.pony.iphone.utils.AppHttpCodeEnum;
//import com.pony.iphone.utils.PageParam;
//import com.pony.iphone.utils.R;
//import io.swagger.v3.oas.annotations.Operation;
//import io.swagger.v3.oas.annotations.Parameter;
//import io.swagger.v3.oas.annotations.responses.ApiResponse;
//import io.swagger.v3.oas.annotations.responses.ApiResponses;
//import io.swagger.v3.oas.annotations.tags.Tag;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.web.bind.annotation.*;
//
//import java.util.ArrayList;
//import java.util.List;
//
///**
// * @author pony
// * @version 1.0
// * @description: 题库增删改查功能
// * @create 2025/8/16 22:40
// */
//@RestController
//@RequestMapping("/question")
//@Tag(name = "问题管理", description = "问题的增删改查，其中lua开头的时给脚本使用的，其他是给管理系统使用的")
//public class QuestionController {
//
//    @Autowired
//    private QuestionService questionService;
//
//    /**
//     * lua脚本：上传一个问题以及问题的所有答案，Lua脚本将遇见的新题上交给服务器
//     * @param qaDto 一个问题和及其答案
//     * @return R 上传的情况结果返回
//     */
//    @Operation(summary = "lua：上传一个问题",
//               description = "上传一个问题以及问题的所有答案，Lua脚本将遇见的新题上交给服务器")
//    @ApiResponses({
//            @ApiResponse(responseCode = "200", description = "上传成功"),
//            @ApiResponse(responseCode = "400", description = "操作失败"),
//    })
//    @PostMapping("/lua/upload")
//    public R uploadForLua(@Parameter(description = "问题及答案Dto", required = true)
//                        @RequestBody QuestionAnswerDto qaDto){
//        return questionService.uploadForLua(qaDto);
//    }
//
//    /**
//     * lua脚本：获得一个问题的答案
//     * @param qaDto 一个问题和所有答案选项
//     * @return
//     */
//    @Operation(summary = "lua：获得一个问题的答案",
//            description = """
//            获得一个问题的答案，
//            1、包含了上传问题，计算权重和返回数据的基础功能
//            第一次上传问题，数据库没有先添加到数据库，然后返回一个随机的答案选项，如果不是第一次上传，然后会根据数据库中的选项分数计算权重，返回一个权重较大的选项，分数越大被选择的概率越小。
//            权重的计算公式：= 最大分数 + 1 - 当前分数
//            然后计算总权重，最后根据总权重计算一个随机数，选择点，看这个点落到了哪个选项分数的区间内，这样就实现了分数与权重的逆转。其中公式1的目的相当于给一个选项的保底，不会因为选项分数过大而导致永远不可能被选中
//            例如：这里有2个选项，Yes: 7, No: 2，计算权重，Yes: 7+1-7，No: 7+1-1, Yes:1 No:7，计算总权重也就是8，会在[0-8]计算出一个随机的选择点, yes[0-1]，no[1-7]，也就意味着yes被选择并返回的概率时12.5%
//            2、当上传的是一个新题的时候，钉钉机器人会发送一条消息通知我，由于钉钉的限流，机器人一分钟只能发20条消息，所以这里使用mq消息队列采用异步的方式发送，接口会将题目传到生产者，后面就不需要管了
//            """)
//    @ApiResponses({
//            @ApiResponse(responseCode = "200", description = "上传成功"),
//            @ApiResponse(responseCode = "400", description = "操作失败"),
//            @ApiResponse(responseCode = "500", description = "参数缺失"),
//    })
//    @PostMapping("/lua/getAnswer")
//    public R getAnswerForLua(@Parameter(description = "问题及答案Dto", required = true)
//            @RequestBody QuestionAnswerDto qaDto){
//        // 参数校验
//        if (qaDto.getQuestion() == null || qaDto.getQuestion().isEmpty()){
//            return R.error(AppHttpCodeEnum.PARAMETER_LACK)
//                    .message("参数错误，问题为空！");
//        }
//        if (qaDto.getLibraryName() == null || qaDto.getLibraryName().isEmpty()){
//            return R.error(AppHttpCodeEnum.PARAMETER_LACK)
//                    .message("参数错误，题库名称为空！");
//        }
//        return questionService.getAnswerForLua(qaDto);
//    }
//
//    /**
//     * lua：获取当前一个题库所有问题的稳定版本，供脚本使用
//     * 这里只负责查询，而不计算（lua脚本需要流畅执行，没必要在这里进行计算来，lua脚本也没必要每次都获取最新的稳定）
//     * 计算会有专门的定时任务进行更新数据（每天晚上0点更新）
//     *
//     * 思路：就是当一个问题的答案有80%的被点击的概率，则就是这个问题的稳定版本
//     * 当然不是每个问题不一定有稳定版本，因为有一些题可能就没有标准答案，答案选那个都无所谓的
//     * 这时候就会随机选一个答案
//     * @param libraryName 题库名字
//     * @param versionId 稳定版本id，非必传，不传的话就是获取最新的稳定版本
//     * @return R
//     */
//    @Operation(summary = "lua：一个题库的所有问题",
//            description = "上传一个问题以及问题的所有答案，Lua脚本将遇见的新题上交给服务器")
//    @ApiResponses({
//            @ApiResponse(responseCode = "200", description = "上传成功"),
//            @ApiResponse(responseCode = "400", description = "操作失败"),
//            @ApiResponse(responseCode = "500", description = "参数缺失"),
//    })
//    @GetMapping({"/lua/{libraryName}",
//            "/lua/{libraryName}/{versionId}"})
//    public R getStableForLua(@PathVariable("libraryName") String libraryName,
//                             @PathVariable(name = "versionId", required = false) Long versionId){
//        // 参数校验
//        if (libraryName == null) {
//            return R.error(AppHttpCodeEnum.PARAMETER_LACK)
//                    .message("libraryId（题库Id）不能为空！");
//        }
//        return questionService.getStableForLua(libraryName, versionId);
//    }
//
//    /**
//     * lua脚本：提交答题链路
//     * @param questionAnswerErrorDtoList 一个问题和所有答案选项
//     * @return R
//     */
//    @Operation(summary = "lua：提交答题链路",
//            description = "当脚本答题失败时出现403页面，就会将本次答题的所有问题以及本次所选的答案上传，此接口就会处理，就会所选的选项分数加1" )
//    @ApiResponses({
//            @ApiResponse(responseCode = "200", description = "上传成功"),
//            @ApiResponse(responseCode = "400", description = "操作失败"),
//            @ApiResponse(responseCode = "500", description = "参数缺失"),
//    })
//    @PostMapping("/lua/uploadError")
//    public R uploadErrorLua(@RequestBody ArrayList<QuestionAnswerErrorDto> questionAnswerErrorDtoList){
//        return questionService.uploadErrorLua(questionAnswerErrorDtoList);
//    }
//
//    /**
//     * 管理系统：获取问题管理系统分页信息
//     * @param pageCurrent 当前页，默认1
//     * @param pageSize 每页条数，默认10
//     * @param libraryId 题库id 非必传
//     * @param questionKey 问题关键字 非必传（如果传了，必须传题库id）
//     * @return
//     */
//    @Operation(summary = "管理系统：获取问题管理系统分页信息",
//            description = "获取问题管理系统分页信息" )
//    @ApiResponses({
//            @ApiResponse(responseCode = "200", description = "上传成功"),
//            @ApiResponse(responseCode = "400", description = "操作失败")
//    })
//    @GetMapping({"/page/{pageCurrent}/{pageSize}",
//            "/page/{pageCurrent}/{pageSize}/{libraryId}",
//            "/page/{pageCurrent}/{pageSize}/{libraryId}/{questionKey}"})
//    public R getPage(@PathVariable("pageCurrent") Integer pageCurrent,
//                     @PathVariable("pageSize") Integer pageSize,
//                     @PathVariable(name = "libraryId", required = false) Long libraryId,
//                     @PathVariable(name = "questionKey", required = false) String questionKey){
//        PageParam pageParam = new PageParam(pageCurrent, pageSize);
//        return questionService.getPage(pageParam, libraryId, questionKey);
//    }
//}
